#include <iostream>
#include <chrono>
#include <thread>
#include <sw/redis++/redis++.h>
using namespace std;

void test1(sw::redis::Redis& redis)
{
    cout << "测试redis的连接是否正常" << endl;
    string ret = redis.ping();

    cout << ret << endl;

}

void test2(sw::redis::Redis& redis)
{
    cout << "使用redis的 set 和 get 命令" << endl;
    redis.flushall();
    redis.set("key1", "111");    
    redis.set("key2", "222");    
    redis.set("key3", "333");    
    redis.set("key4", "444");    

    auto value1 = redis.get("key1");
    if(value1)
    {
        cout << value1.value() << endl;
    }

    auto value2 = redis.get("key2");
    if(value2)
    {
        cout << value2.value() << endl;
    }

    auto value3 = redis.get("key3");
    if(value3)
    {
        cout << value3.value() << endl;
    }

    auto value4 = redis.get("key4");
    if(value4)
    {
        cout << value4.value() << endl;
    }

    auto value5 = redis.get("key5");
    if(value5)
    {
        cout << value5.value() << endl;
    }

}

void test3(sw::redis::Redis& redis)
{
    cout << "使用exists" << endl;
    redis.flushall();

    redis.set("key1", "111");
    auto e1 = redis.exists("key1");
    cout << e1 << endl;

    auto e2 = redis.exists("key2");
    cout << e2 << endl;

    auto e3 = redis.exists({"key1", "key2", "key3"});
    cout << e3 << endl;
}

void test4(sw::redis::Redis& redis)
{
    cout << "使用del" << endl;
    redis.flushall();

    redis.set("key1", "111");
    redis.set("key2", "222");
    redis.set("key3", "333");
    redis.set("key4", "444");
    redis.set("key5", "555");

    auto e1 = redis.exists("key1");
    cout << e1 << endl;

    redis.del("key1");
    auto e2 = redis.exists("key1");
    cout << e2 << endl;

    auto e3 = redis.del({"key2", "key3", "key4", "key5", "key6"});
    cout << e3 << endl;
}

void test5(sw::redis::Redis& redis)
{
    cout << "使用keys" << endl;
    redis.flushall();

    redis.set("key1", "111");
    redis.set("key2", "222");
    redis.set("key3", "333");
    redis.set("key4", "444");
    redis.set("key5", "555");

    std::vector<std::string> ret;
    auto bit = std::back_inserter(ret);
    redis.keys("*", bit);

    for(auto & key : ret)
    {
        cout << key << endl;
    }
}

void test6(sw::redis::Redis& redis)
{
    using namespace std::chrono_literals;
    cout << "使用expire和ttl" << endl;
    redis.flushall();

    redis.set("key1", "111");

    redis.expire("key1", std::chrono::seconds(10));

    std::this_thread::sleep_for(3s);

    auto ttl = redis.ttl("key1");
    cout << ttl << endl;
}

void test7(sw::redis::Redis& redis)
{
    cout << "使用type" << endl;
    redis.flushall();

    redis.set("key1", "111");
    auto res = redis.type("key1");
    cout << "key1 type: " << res << endl;

    redis.lpush("key2", "222");
    res = redis.type("key2");
    cout << "key2 type: " << res << endl;

    redis.hset("key3", "aaa", "111");
    res = redis.type("key3");
    cout << "key3 type: " << res << endl;

    redis.sadd("key4", "444");
    res = redis.type("key4");
    cout << "key4 type: " << res << endl;

    redis.zadd("key5", "555", 90);
    res = redis.type("key5");
    cout << "key5 type: " << res << endl;

}

int main()
{
    // 创建redis对象
    // 使用url格式来进行书写连接信息
    sw::redis::Redis redis("tcp://127.0.0.1:6379");

    // test1(redis);
    // test2(redis);
    // test3(redis);
    // test4(redis);
    // test5(redis);
    // test6(redis);
    test7(redis);


    

    return 0;
}